home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / ccompiler.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  37KB  |  977 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''distutils.ccompiler
  5.  
  6. Contains CCompiler, an abstract base class that defines the interface
  7. for the Distutils compiler abstraction model.'''
  8. __revision__ = '$Id: ccompiler.py,v 1.61 2004/11/10 22:23:13 loewis Exp $'
  9. import sys
  10. import os
  11. import re
  12. from types import *
  13. from copy import copy
  14. from distutils.errors import *
  15. from distutils.spawn import spawn
  16. from distutils.file_util import move_file
  17. from distutils.dir_util import mkpath
  18. from distutils.dep_util import newer_pairwise, newer_group
  19. from distutils.sysconfig import python_build
  20. from distutils.util import split_quoted, execute
  21. from distutils import log
  22.  
  23. class CCompiler:
  24.     '''Abstract base class to define the interface that must be implemented
  25.     by real compiler classes.  Also has some utility methods used by
  26.     several compiler classes.
  27.  
  28.     The basic idea behind a compiler abstraction class is that each
  29.     instance can be used for all the compile/link steps in building a
  30.     single project.  Thus, attributes common to all of those compile and
  31.     link steps -- include directories, macros to define, libraries to link
  32.     against, etc. -- are attributes of the compiler instance.  To allow for
  33.     variability in how individual files are treated, most of those
  34.     attributes may be varied on a per-compilation or per-link basis.
  35.     '''
  36.     compiler_type = None
  37.     src_extensions = None
  38.     obj_extension = None
  39.     static_lib_extension = None
  40.     shared_lib_extension = None
  41.     static_lib_format = None
  42.     shared_lib_format = None
  43.     exe_extension = None
  44.     language_map = {
  45.         '.c': 'c',
  46.         '.cc': 'c++',
  47.         '.cpp': 'c++',
  48.         '.cxx': 'c++',
  49.         '.m': 'objc' }
  50.     language_order = [
  51.         'c++',
  52.         'objc',
  53.         'c']
  54.     
  55.     def __init__(self, verbose = 0, dry_run = 0, force = 0):
  56.         self.dry_run = dry_run
  57.         self.force = force
  58.         self.verbose = verbose
  59.         self.output_dir = None
  60.         self.macros = []
  61.         self.include_dirs = []
  62.         self.libraries = []
  63.         self.library_dirs = []
  64.         self.runtime_library_dirs = []
  65.         self.objects = []
  66.         for key in self.executables.keys():
  67.             self.set_executable(key, self.executables[key])
  68.         
  69.  
  70.     
  71.     def set_executables(self, **args):
  72.         """Define the executables (and options for them) that will be run
  73.         to perform the various stages of compilation.  The exact set of
  74.         executables that may be specified here depends on the compiler
  75.         class (via the 'executables' class attribute), but most will have:
  76.           compiler      the C/C++ compiler
  77.           linker_so     linker used to create shared objects and libraries
  78.           linker_exe    linker used to create binary executables
  79.           archiver      static library creator
  80.  
  81.         On platforms with a command-line (Unix, DOS/Windows), each of these
  82.         is a string that will be split into executable name and (optional)
  83.         list of arguments.  (Splitting the string is done similarly to how
  84.         Unix shells operate: words are delimited by spaces, but quotes and
  85.         backslashes can override this.  See
  86.         'distutils.util.split_quoted()'.)
  87.         """
  88.         for key in args.keys():
  89.             if not self.executables.has_key(key):
  90.                 raise ValueError, "unknown executable '%s' for class %s" % (key, self.__class__.__name__)
  91.             
  92.             self.set_executable(key, args[key])
  93.         
  94.  
  95.     
  96.     def set_executable(self, key, value):
  97.         if type(value) is StringType:
  98.             setattr(self, key, split_quoted(value))
  99.         else:
  100.             setattr(self, key, value)
  101.  
  102.     
  103.     def _find_macro(self, name):
  104.         i = 0
  105.         for defn in self.macros:
  106.             if defn[0] == name:
  107.                 return i
  108.             
  109.             i = i + 1
  110.         
  111.  
  112.     
  113.     def _check_macro_definitions(self, definitions):
  114.         """Ensures that every element of 'definitions' is a valid macro
  115.         definition, ie. either (name,value) 2-tuple or a (name,) tuple.  Do
  116.         nothing if all definitions are OK, raise TypeError otherwise.
  117.         """
  118.         for defn in definitions:
  119.             if type(defn) is TupleType:
  120.                 if len(defn) == 1 or len(defn) == 2:
  121.                     if not (type(defn[1]) is StringType or defn[1] is None) and type(defn[0]) is StringType:
  122.                         raise TypeError, "invalid macro definition '%s': " % defn + 'must be tuple (string,), (string, string), or ' + '(string, None)'
  123.                         continue
  124.         
  125.  
  126.     
  127.     def define_macro(self, name, value = None):
  128.         """Define a preprocessor macro for all compilations driven by this
  129.         compiler object.  The optional parameter 'value' should be a
  130.         string; if it is not supplied, then the macro will be defined
  131.         without an explicit value and the exact outcome depends on the
  132.         compiler used (XXX true? does ANSI say anything about this?)
  133.         """
  134.         i = self._find_macro(name)
  135.         if i is not None:
  136.             del self.macros[i]
  137.         
  138.         defn = (name, value)
  139.         self.macros.append(defn)
  140.  
  141.     
  142.     def undefine_macro(self, name):
  143.         """Undefine a preprocessor macro for all compilations driven by
  144.         this compiler object.  If the same macro is defined by
  145.         'define_macro()' and undefined by 'undefine_macro()' the last call
  146.         takes precedence (including multiple redefinitions or
  147.         undefinitions).  If the macro is redefined/undefined on a
  148.         per-compilation basis (ie. in the call to 'compile()'), then that
  149.         takes precedence.
  150.         """
  151.         i = self._find_macro(name)
  152.         if i is not None:
  153.             del self.macros[i]
  154.         
  155.         undefn = (name,)
  156.         self.macros.append(undefn)
  157.  
  158.     
  159.     def add_include_dir(self, dir):
  160.         """Add 'dir' to the list of directories that will be searched for
  161.         header files.  The compiler is instructed to search directories in
  162.         the order in which they are supplied by successive calls to
  163.         'add_include_dir()'.
  164.         """
  165.         self.include_dirs.append(dir)
  166.  
  167.     
  168.     def set_include_dirs(self, dirs):
  169.         """Set the list of directories that will be searched to 'dirs' (a
  170.         list of strings).  Overrides any preceding calls to
  171.         'add_include_dir()'; subsequence calls to 'add_include_dir()' add
  172.         to the list passed to 'set_include_dirs()'.  This does not affect
  173.         any list of standard include directories that the compiler may
  174.         search by default.
  175.         """
  176.         self.include_dirs = copy(dirs)
  177.  
  178.     
  179.     def add_library(self, libname):
  180.         """Add 'libname' to the list of libraries that will be included in
  181.         all links driven by this compiler object.  Note that 'libname'
  182.         should *not* be the name of a file containing a library, but the
  183.         name of the library itself: the actual filename will be inferred by
  184.         the linker, the compiler, or the compiler class (depending on the
  185.         platform).
  186.  
  187.         The linker will be instructed to link against libraries in the
  188.         order they were supplied to 'add_library()' and/or
  189.         'set_libraries()'.  It is perfectly valid to duplicate library
  190.         names; the linker will be instructed to link against libraries as
  191.         many times as they are mentioned.
  192.         """
  193.         self.libraries.append(libname)
  194.  
  195.     
  196.     def set_libraries(self, libnames):
  197.         """Set the list of libraries to be included in all links driven by
  198.         this compiler object to 'libnames' (a list of strings).  This does
  199.         not affect any standard system libraries that the linker may
  200.         include by default.
  201.         """
  202.         self.libraries = copy(libnames)
  203.  
  204.     
  205.     def add_library_dir(self, dir):
  206.         """Add 'dir' to the list of directories that will be searched for
  207.         libraries specified to 'add_library()' and 'set_libraries()'.  The
  208.         linker will be instructed to search for libraries in the order they
  209.         are supplied to 'add_library_dir()' and/or 'set_library_dirs()'.
  210.         """
  211.         self.library_dirs.append(dir)
  212.  
  213.     
  214.     def set_library_dirs(self, dirs):
  215.         """Set the list of library search directories to 'dirs' (a list of
  216.         strings).  This does not affect any standard library search path
  217.         that the linker may search by default.
  218.         """
  219.         self.library_dirs = copy(dirs)
  220.  
  221.     
  222.     def add_runtime_library_dir(self, dir):
  223.         """Add 'dir' to the list of directories that will be searched for
  224.         shared libraries at runtime.
  225.         """
  226.         self.runtime_library_dirs.append(dir)
  227.  
  228.     
  229.     def set_runtime_library_dirs(self, dirs):
  230.         """Set the list of directories to search for shared libraries at
  231.         runtime to 'dirs' (a list of strings).  This does not affect any
  232.         standard search path that the runtime linker may search by
  233.         default.
  234.         """
  235.         self.runtime_library_dirs = copy(dirs)
  236.  
  237.     
  238.     def add_link_object(self, object):
  239.         '''Add \'object\' to the list of object files (or analogues, such as
  240.         explicitly named library files or the output of "resource
  241.         compilers") to be included in every link driven by this compiler
  242.         object.
  243.         '''
  244.         self.objects.append(object)
  245.  
  246.     
  247.     def set_link_objects(self, objects):
  248.         """Set the list of object files (or analogues) to be included in
  249.         every link to 'objects'.  This does not affect any standard object
  250.         files that the linker may include by default (such as system
  251.         libraries).
  252.         """
  253.         self.objects = copy(objects)
  254.  
  255.     
  256.     def _setup_compile(self, outdir, macros, incdirs, sources, depends, extra):
  257.         '''Process arguments and decide which source files to compile.
  258.  
  259.         Merges _fix_compile_args() and _prep_compile().
  260.         '''
  261.         if outdir is None:
  262.             outdir = self.output_dir
  263.         elif type(outdir) is not StringType:
  264.             raise TypeError, "'output_dir' must be a string or None"
  265.         
  266.         if macros is None:
  267.             macros = self.macros
  268.         elif type(macros) is ListType:
  269.             if not self.macros:
  270.                 pass
  271.             macros = macros + []
  272.         else:
  273.             raise TypeError, "'macros' (if supplied) must be a list of tuples"
  274.         if incdirs is None:
  275.             incdirs = self.include_dirs
  276.         elif type(incdirs) in (ListType, TupleType):
  277.             if not self.include_dirs:
  278.                 pass
  279.             incdirs = list(incdirs) + []
  280.         else:
  281.             raise TypeError, "'include_dirs' (if supplied) must be a list of strings"
  282.         if extra is None:
  283.             extra = []
  284.         
  285.         objects = self.object_filenames(sources, strip_dir = python_build, output_dir = outdir)
  286.         if self.force:
  287.             skip_source = { }
  288.             for source in sources:
  289.                 skip_source[source] = 0
  290.             
  291.         elif depends is None:
  292.             skip_source = { }
  293.             for source in sources:
  294.                 skip_source[source] = 1
  295.             
  296.             (n_sources, n_objects) = newer_pairwise(sources, objects)
  297.             for source in n_sources:
  298.                 skip_source[source] = 0
  299.             
  300.         else:
  301.             skip_source = { }
  302.             L = depends[:] + [
  303.                 None]
  304.             for i in range(len(objects)):
  305.                 source = sources[i]
  306.                 L[-1] = source
  307.                 if newer_group(L, objects[i]):
  308.                     skip_source[source] = 0
  309.                     continue
  310.                 skip_source[source] = 1
  311.             
  312.         pp_opts = gen_preprocess_options(macros, incdirs)
  313.         build = { }
  314.         for i in range(len(sources)):
  315.             src = sources[i]
  316.             obj = objects[i]
  317.             ext = os.path.splitext(src)[1]
  318.             self.mkpath(os.path.dirname(obj))
  319.             if skip_source[src]:
  320.                 log.debug('skipping %s (%s up-to-date)', src, obj)
  321.                 continue
  322.             build[obj] = (src, ext)
  323.         
  324.         return (macros, objects, extra, pp_opts, build)
  325.  
  326.     
  327.     def _get_cc_args(self, pp_opts, debug, before):
  328.         cc_args = pp_opts + [
  329.             '-c']
  330.         if debug:
  331.             cc_args[:0] = [
  332.                 '-g']
  333.         
  334.         if before:
  335.             cc_args[:0] = before
  336.         
  337.         return cc_args
  338.  
  339.     
  340.     def _fix_compile_args(self, output_dir, macros, include_dirs):
  341.         """Typecheck and fix-up some of the arguments to the 'compile()'
  342.         method, and return fixed-up values.  Specifically: if 'output_dir'
  343.         is None, replaces it with 'self.output_dir'; ensures that 'macros'
  344.         is a list, and augments it with 'self.macros'; ensures that
  345.         'include_dirs' is a list, and augments it with 'self.include_dirs'.
  346.         Guarantees that the returned values are of the correct type,
  347.         i.e. for 'output_dir' either string or None, and for 'macros' and
  348.         'include_dirs' either list or None.
  349.         """
  350.         if output_dir is None:
  351.             output_dir = self.output_dir
  352.         elif type(output_dir) is not StringType:
  353.             raise TypeError, "'output_dir' must be a string or None"
  354.         
  355.         if macros is None:
  356.             macros = self.macros
  357.         elif type(macros) is ListType:
  358.             if not self.macros:
  359.                 pass
  360.             macros = macros + []
  361.         else:
  362.             raise TypeError, "'macros' (if supplied) must be a list of tuples"
  363.         if include_dirs is None:
  364.             include_dirs = self.include_dirs
  365.         elif type(include_dirs) in (ListType, TupleType):
  366.             if not self.include_dirs:
  367.                 pass
  368.             include_dirs = list(include_dirs) + []
  369.         else:
  370.             raise TypeError, "'include_dirs' (if supplied) must be a list of strings"
  371.         return (output_dir, macros, include_dirs)
  372.  
  373.     
  374.     def _prep_compile(self, sources, output_dir, depends = None):
  375.         """Decide which souce files must be recompiled.
  376.  
  377.         Determine the list of object files corresponding to 'sources',
  378.         and figure out which ones really need to be recompiled.
  379.         Return a list of all object files and a dictionary telling
  380.         which source files can be skipped.
  381.         """
  382.         objects = self.object_filenames(sources, strip_dir = python_build, output_dir = output_dir)
  383.         if self.force:
  384.             skip_source = { }
  385.             for source in sources:
  386.                 skip_source[source] = 0
  387.             
  388.         elif depends is None:
  389.             skip_source = { }
  390.             for source in sources:
  391.                 skip_source[source] = 1
  392.             
  393.             (n_sources, n_objects) = newer_pairwise(sources, objects)
  394.             for source in n_sources:
  395.                 skip_source[source] = 0
  396.             
  397.         else:
  398.             skip_source = { }
  399.             L = depends[:] + [
  400.                 None]
  401.             for i in range(len(objects)):
  402.                 source = sources[i]
  403.                 L[-1] = source
  404.                 if newer_group(L, objects[i]):
  405.                     skip_source[source] = 0
  406.                     continue
  407.                 skip_source[source] = 1
  408.             
  409.         return (objects, skip_source)
  410.  
  411.     
  412.     def _fix_object_args(self, objects, output_dir):
  413.         """Typecheck and fix up some arguments supplied to various methods.
  414.         Specifically: ensure that 'objects' is a list; if output_dir is
  415.         None, replace with self.output_dir.  Return fixed versions of
  416.         'objects' and 'output_dir'.
  417.         """
  418.         if type(objects) not in (ListType, TupleType):
  419.             raise TypeError, "'objects' must be a list or tuple of strings"
  420.         
  421.         objects = list(objects)
  422.         if output_dir is None:
  423.             output_dir = self.output_dir
  424.         elif type(output_dir) is not StringType:
  425.             raise TypeError, "'output_dir' must be a string or None"
  426.         
  427.         return (objects, output_dir)
  428.  
  429.     
  430.     def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
  431.         """Typecheck and fix up some of the arguments supplied to the
  432.         'link_*' methods.  Specifically: ensure that all arguments are
  433.         lists, and augment them with their permanent versions
  434.         (eg. 'self.libraries' augments 'libraries').  Return a tuple with
  435.         fixed versions of all arguments.
  436.         """
  437.         if libraries is None:
  438.             libraries = self.libraries
  439.         elif type(libraries) in (ListType, TupleType):
  440.             if not self.libraries:
  441.                 pass
  442.             libraries = list(libraries) + []
  443.         else:
  444.             raise TypeError, "'libraries' (if supplied) must be a list of strings"
  445.         if library_dirs is None:
  446.             library_dirs = self.library_dirs
  447.         elif type(library_dirs) in (ListType, TupleType):
  448.             if not self.library_dirs:
  449.                 pass
  450.             library_dirs = list(library_dirs) + []
  451.         else:
  452.             raise TypeError, "'library_dirs' (if supplied) must be a list of strings"
  453.         if runtime_library_dirs is None:
  454.             runtime_library_dirs = self.runtime_library_dirs
  455.         elif type(runtime_library_dirs) in (ListType, TupleType):
  456.             if not self.runtime_library_dirs:
  457.                 pass
  458.             runtime_library_dirs = list(runtime_library_dirs) + []
  459.         else:
  460.             raise TypeError, "'runtime_library_dirs' (if supplied) " + 'must be a list of strings'
  461.         return (libraries, library_dirs, runtime_library_dirs)
  462.  
  463.     
  464.     def _need_link(self, objects, output_file):
  465.         """Return true if we need to relink the files listed in 'objects'
  466.         to recreate 'output_file'.
  467.         """
  468.         if self.force:
  469.             return 1
  470.         elif self.dry_run:
  471.             newer = newer_group(objects, output_file, missing = 'newer')
  472.         else:
  473.             newer = newer_group(objects, output_file)
  474.         return newer
  475.  
  476.     
  477.     def detect_language(self, sources):
  478.         '''Detect the language of a given file, or list of files. Uses
  479.         language_map, and language_order to do the job.
  480.         '''
  481.         if type(sources) is not ListType:
  482.             sources = [
  483.                 sources]
  484.         
  485.         lang = None
  486.         index = len(self.language_order)
  487.         for source in sources:
  488.             (base, ext) = os.path.splitext(source)
  489.             extlang = self.language_map.get(ext)
  490.             
  491.             try:
  492.                 extindex = self.language_order.index(extlang)
  493.                 if extindex < index:
  494.                     lang = extlang
  495.                     index = extindex
  496.             continue
  497.             except ValueError:
  498.                 continue
  499.             
  500.  
  501.         
  502.         return lang
  503.  
  504.     
  505.     def preprocess(self, source, output_file = None, macros = None, include_dirs = None, extra_preargs = None, extra_postargs = None):
  506.         """Preprocess a single C/C++ source file, named in 'source'.
  507.         Output will be written to file named 'output_file', or stdout if
  508.         'output_file' not supplied.  'macros' is a list of macro
  509.         definitions as for 'compile()', which will augment the macros set
  510.         with 'define_macro()' and 'undefine_macro()'.  'include_dirs' is a
  511.         list of directory names that will be added to the default list.
  512.  
  513.         Raises PreprocessError on failure.
  514.         """
  515.         pass
  516.  
  517.     
  518.     def compile(self, sources, output_dir = None, macros = None, include_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, depends = None):
  519.         '''Compile one or more source files.
  520.  
  521.         \'sources\' must be a list of filenames, most likely C/C++
  522.         files, but in reality anything that can be handled by a
  523.         particular compiler and compiler class (eg. MSVCCompiler can
  524.         handle resource files in \'sources\').  Return a list of object
  525.         filenames, one per source filename in \'sources\'.  Depending on
  526.         the implementation, not all source files will necessarily be
  527.         compiled, but all corresponding object filenames will be
  528.         returned.
  529.  
  530.         If \'output_dir\' is given, object files will be put under it, while
  531.         retaining their original path component.  That is, "foo/bar.c"
  532.         normally compiles to "foo/bar.o" (for a Unix implementation); if
  533.         \'output_dir\' is "build", then it would compile to
  534.         "build/foo/bar.o".
  535.  
  536.         \'macros\', if given, must be a list of macro definitions.  A macro
  537.         definition is either a (name, value) 2-tuple or a (name,) 1-tuple.
  538.         The former defines a macro; if the value is None, the macro is
  539.         defined without an explicit value.  The 1-tuple case undefines a
  540.         macro.  Later definitions/redefinitions/ undefinitions take
  541.         precedence.
  542.  
  543.         \'include_dirs\', if given, must be a list of strings, the
  544.         directories to add to the default include file search path for this
  545.         compilation only.
  546.  
  547.         \'debug\' is a boolean; if true, the compiler will be instructed to
  548.         output debug symbols in (or alongside) the object file(s).
  549.  
  550.         \'extra_preargs\' and \'extra_postargs\' are implementation- dependent.
  551.         On platforms that have the notion of a command-line (e.g. Unix,
  552.         DOS/Windows), they are most likely lists of strings: extra
  553.         command-line arguments to prepand/append to the compiler command
  554.         line.  On other platforms, consult the implementation class
  555.         documentation.  In any event, they are intended as an escape hatch
  556.         for those occasions when the abstract compiler framework doesn\'t
  557.         cut the mustard.
  558.  
  559.         \'depends\', if given, is a list of filenames that all targets
  560.         depend on.  If a source file is older than any file in
  561.         depends, then the source file will be recompiled.  This
  562.         supports dependency tracking, but only at a coarse
  563.         granularity.
  564.  
  565.         Raises CompileError on failure.
  566.         '''
  567.         (macros, objects, extra_postargs, pp_opts, build) = self._setup_compile(output_dir, macros, include_dirs, sources, depends, extra_postargs)
  568.         cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
  569.         for obj in objects:
  570.             
  571.             try:
  572.                 (src, ext) = build[obj]
  573.             except KeyError:
  574.                 continue
  575.  
  576.             self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
  577.         
  578.         return objects
  579.  
  580.     
  581.     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
  582.         """Compile 'src' to product 'obj'."""
  583.         pass
  584.  
  585.     
  586.     def create_static_lib(self, objects, output_libname, output_dir = None, debug = 0, target_lang = None):
  587.         '''Link a bunch of stuff together to create a static library file.
  588.         The "bunch of stuff" consists of the list of object files supplied
  589.         as \'objects\', the extra object files supplied to
  590.         \'add_link_object()\' and/or \'set_link_objects()\', the libraries
  591.         supplied to \'add_library()\' and/or \'set_libraries()\', and the
  592.         libraries supplied as \'libraries\' (if any).
  593.  
  594.         \'output_libname\' should be a library name, not a filename; the
  595.         filename will be inferred from the library name.  \'output_dir\' is
  596.         the directory where the library file will be put.
  597.  
  598.         \'debug\' is a boolean; if true, debugging information will be
  599.         included in the library (note that on most platforms, it is the
  600.         compile step where this matters: the \'debug\' flag is included here
  601.         just for consistency).
  602.  
  603.         \'target_lang\' is the target language for which the given objects
  604.         are being compiled. This allows specific linkage time treatment of
  605.         certain languages.
  606.  
  607.         Raises LibError on failure.
  608.         '''
  609.         pass
  610.  
  611.     SHARED_OBJECT = 'shared_object'
  612.     SHARED_LIBRARY = 'shared_library'
  613.     EXECUTABLE = 'executable'
  614.     
  615.     def link(self, target_desc, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  616.         '''Link a bunch of stuff together to create an executable or
  617.         shared library file.
  618.  
  619.         The "bunch of stuff" consists of the list of object files supplied
  620.         as \'objects\'.  \'output_filename\' should be a filename.  If
  621.         \'output_dir\' is supplied, \'output_filename\' is relative to it
  622.         (i.e. \'output_filename\' can provide directory components if
  623.         needed).
  624.  
  625.         \'libraries\' is a list of libraries to link against.  These are
  626.         library names, not filenames, since they\'re translated into
  627.         filenames in a platform-specific way (eg. "foo" becomes "libfoo.a"
  628.         on Unix and "foo.lib" on DOS/Windows).  However, they can include a
  629.         directory component, which means the linker will look in that
  630.         specific directory rather than searching all the normal locations.
  631.  
  632.         \'library_dirs\', if supplied, should be a list of directories to
  633.         search for libraries that were specified as bare library names
  634.         (ie. no directory component).  These are on top of the system
  635.         default and those supplied to \'add_library_dir()\' and/or
  636.         \'set_library_dirs()\'.  \'runtime_library_dirs\' is a list of
  637.         directories that will be embedded into the shared library and used
  638.         to search for other shared libraries that *it* depends on at
  639.         run-time.  (This may only be relevant on Unix.)
  640.  
  641.         \'export_symbols\' is a list of symbols that the shared library will
  642.         export.  (This appears to be relevant only on Windows.)
  643.  
  644.         \'debug\' is as for \'compile()\' and \'create_static_lib()\', with the
  645.         slight distinction that it actually matters on most platforms (as
  646.         opposed to \'create_static_lib()\', which includes a \'debug\' flag
  647.         mostly for form\'s sake).
  648.  
  649.         \'extra_preargs\' and \'extra_postargs\' are as for \'compile()\' (except
  650.         of course that they supply command-line arguments for the
  651.         particular linker being used).
  652.  
  653.         \'target_lang\' is the target language for which the given objects
  654.         are being compiled. This allows specific linkage time treatment of
  655.         certain languages.
  656.  
  657.         Raises LinkError on failure.
  658.         '''
  659.         raise NotImplementedError
  660.  
  661.     
  662.     def link_shared_lib(self, objects, output_libname, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  663.         self.link(CCompiler.SHARED_LIBRARY, objects, self.library_filename(output_libname, lib_type = 'shared'), output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)
  664.  
  665.     
  666.     def link_shared_object(self, objects, output_filename, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, export_symbols = None, debug = 0, extra_preargs = None, extra_postargs = None, build_temp = None, target_lang = None):
  667.         self.link(CCompiler.SHARED_OBJECT, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)
  668.  
  669.     
  670.     def link_executable(self, objects, output_progname, output_dir = None, libraries = None, library_dirs = None, runtime_library_dirs = None, debug = 0, extra_preargs = None, extra_postargs = None, target_lang = None):
  671.         self.link(CCompiler.EXECUTABLE, objects, self.executable_filename(output_progname), output_dir, libraries, library_dirs, runtime_library_dirs, None, debug, extra_preargs, extra_postargs, None, target_lang)
  672.  
  673.     
  674.     def library_dir_option(self, dir):
  675.         """Return the compiler option to add 'dir' to the list of
  676.         directories searched for libraries.
  677.         """
  678.         raise NotImplementedError
  679.  
  680.     
  681.     def runtime_library_dir_option(self, dir):
  682.         """Return the compiler option to add 'dir' to the list of
  683.         directories searched for runtime libraries.
  684.         """
  685.         raise NotImplementedError
  686.  
  687.     
  688.     def library_option(self, lib):
  689.         """Return the compiler option to add 'dir' to the list of libraries
  690.         linked into the shared library or executable.
  691.         """
  692.         raise NotImplementedError
  693.  
  694.     
  695.     def has_function(self, funcname, includes = None, include_dirs = None, libraries = None, library_dirs = None):
  696.         '''Return a boolean indicating whether funcname is supported on
  697.         the current platform.  The optional arguments can be used to
  698.         augment the compilation environment.
  699.         '''
  700.         import tempfile as tempfile
  701.         if includes is None:
  702.             includes = []
  703.         
  704.         if include_dirs is None:
  705.             include_dirs = []
  706.         
  707.         if libraries is None:
  708.             libraries = []
  709.         
  710.         if library_dirs is None:
  711.             library_dirs = []
  712.         
  713.         (fd, fname) = tempfile.mkstemp('.c', funcname, text = True)
  714.         f = os.fdopen(fd, 'w')
  715.         for incl in includes:
  716.             f.write('#include "%s"\n' % incl)
  717.         
  718.         f.write('main (int argc, char **argv) {\n    %s();\n}\n' % funcname)
  719.         f.close()
  720.         
  721.         try:
  722.             objects = self.compile([
  723.                 fname], include_dirs = include_dirs)
  724.         except CompileError:
  725.             return False
  726.  
  727.         
  728.         try:
  729.             self.link_executable(objects, 'a.out', libraries = libraries, library_dirs = library_dirs)
  730.         except (LinkError, TypeError):
  731.             return False
  732.  
  733.         return True
  734.  
  735.     
  736.     def find_library_file(self, dirs, lib, debug = 0):
  737.         """Search the specified list of directories for a static or shared
  738.         library file 'lib' and return the full path to that file.  If
  739.         'debug' true, look for a debugging version (if that makes sense on
  740.         the current platform).  Return None if 'lib' wasn't found in any of
  741.         the specified directories.
  742.         """
  743.         raise NotImplementedError
  744.  
  745.     
  746.     def object_filenames(self, source_filenames, strip_dir = 0, output_dir = ''):
  747.         if output_dir is None:
  748.             output_dir = ''
  749.         
  750.         obj_names = []
  751.         for src_name in source_filenames:
  752.             (base, ext) = os.path.splitext(src_name)
  753.             base = os.path.splitdrive(base)[1]
  754.             base = base[os.path.isabs(base):]
  755.             if ext not in self.src_extensions:
  756.                 raise UnknownFileError, "unknown file type '%s' (from '%s')" % (ext, src_name)
  757.             
  758.             if strip_dir:
  759.                 base = os.path.basename(base)
  760.             
  761.             obj_names.append(os.path.join(output_dir, base + self.obj_extension))
  762.         
  763.         return obj_names
  764.  
  765.     
  766.     def shared_object_filename(self, basename, strip_dir = 0, output_dir = ''):
  767.         if strip_dir:
  768.             basename = os.path.basename(basename)
  769.         
  770.         return os.path.join(output_dir, basename + self.shared_lib_extension)
  771.  
  772.     
  773.     def executable_filename(self, basename, strip_dir = 0, output_dir = ''):
  774.         if strip_dir:
  775.             basename = os.path.basename(basename)
  776.         
  777.         if not self.exe_extension:
  778.             pass
  779.         return os.path.join(output_dir, basename + '')
  780.  
  781.     
  782.     def library_filename(self, libname, lib_type = 'static', strip_dir = 0, output_dir = ''):
  783.         if lib_type not in ('static', 'shared', 'dylib'):
  784.             raise ValueError, '\'lib_type\' must be "static", "shared" or "dylib"'
  785.         
  786.         fmt = getattr(self, lib_type + '_lib_format')
  787.         ext = getattr(self, lib_type + '_lib_extension')
  788.         (dir, base) = os.path.split(libname)
  789.         filename = fmt % (base, ext)
  790.         if strip_dir:
  791.             dir = ''
  792.         
  793.         return os.path.join(output_dir, dir, filename)
  794.  
  795.     
  796.     def announce(self, msg, level = 1):
  797.         log.debug(msg)
  798.  
  799.     
  800.     def debug_print(self, msg):
  801.         DEBUG = DEBUG
  802.         import distutils.debug
  803.         if DEBUG:
  804.             print msg
  805.         
  806.  
  807.     
  808.     def warn(self, msg):
  809.         sys.stderr.write('warning: %s\n' % msg)
  810.  
  811.     
  812.     def execute(self, func, args, msg = None, level = 1):
  813.         execute(func, args, msg, self.dry_run)
  814.  
  815.     
  816.     def spawn(self, cmd):
  817.         spawn(cmd, dry_run = self.dry_run)
  818.  
  819.     
  820.     def move_file(self, src, dst):
  821.         return move_file(src, dst, dry_run = self.dry_run)
  822.  
  823.     
  824.     def mkpath(self, name, mode = 511):
  825.         mkpath(name, mode, self.dry_run)
  826.  
  827.  
  828. _default_compilers = (('cygwin.*', 'unix'), ('os2emx', 'emx'), ('posix', 'unix'), ('nt', 'msvc'), ('mac', 'mwerks'))
  829.  
  830. def get_default_compiler(osname = None, platform = None):
  831.     ''' Determine the default compiler to use for the given platform.
  832.  
  833.         osname should be one of the standard Python OS names (i.e. the
  834.         ones returned by os.name) and platform the common value
  835.         returned by sys.platform for the platform in question.
  836.  
  837.         The default values are os.name and sys.platform in case the
  838.         parameters are not given.
  839.  
  840.     '''
  841.     if osname is None:
  842.         osname = os.name
  843.     
  844.     if platform is None:
  845.         platform = sys.platform
  846.     
  847.     for pattern, compiler in _default_compilers:
  848.         if re.match(pattern, platform) is not None or re.match(pattern, osname) is not None:
  849.             return compiler
  850.             continue
  851.     
  852.     return 'unix'
  853.  
  854. compiler_class = {
  855.     'unix': ('unixccompiler', 'UnixCCompiler', 'standard UNIX-style compiler'),
  856.     'msvc': ('msvccompiler', 'MSVCCompiler', 'Microsoft Visual C++'),
  857.     'cygwin': ('cygwinccompiler', 'CygwinCCompiler', 'Cygwin port of GNU C Compiler for Win32'),
  858.     'mingw32': ('cygwinccompiler', 'Mingw32CCompiler', 'Mingw32 port of GNU C Compiler for Win32'),
  859.     'bcpp': ('bcppcompiler', 'BCPPCompiler', 'Borland C++ Compiler'),
  860.     'mwerks': ('mwerkscompiler', 'MWerksCompiler', 'MetroWerks CodeWarrior'),
  861.     'emx': ('emxccompiler', 'EMXCCompiler', 'EMX port of GNU C Compiler for OS/2') }
  862.  
  863. def show_compilers():
  864.     '''Print list of available compilers (used by the "--help-compiler"
  865.     options to "build", "build_ext", "build_clib").
  866.     '''
  867.     FancyGetopt = FancyGetopt
  868.     import distutils.fancy_getopt
  869.     compilers = []
  870.     for compiler in compiler_class.keys():
  871.         compilers.append(('compiler=' + compiler, None, compiler_class[compiler][2]))
  872.     
  873.     compilers.sort()
  874.     pretty_printer = FancyGetopt(compilers)
  875.     pretty_printer.print_help('List of available compilers:')
  876.  
  877.  
  878. def new_compiler(plat = None, compiler = None, verbose = 0, dry_run = 0, force = 0):
  879.     '''Generate an instance of some CCompiler subclass for the supplied
  880.     platform/compiler combination.  \'plat\' defaults to \'os.name\'
  881.     (eg. \'posix\', \'nt\'), and \'compiler\' defaults to the default compiler
  882.     for that platform.  Currently only \'posix\' and \'nt\' are supported, and
  883.     the default compilers are "traditional Unix interface" (UnixCCompiler
  884.     class) and Visual C++ (MSVCCompiler class).  Note that it\'s perfectly
  885.     possible to ask for a Unix compiler object under Windows, and a
  886.     Microsoft compiler object under Unix -- if you supply a value for
  887.     \'compiler\', \'plat\' is ignored.
  888.     '''
  889.     if plat is None:
  890.         plat = os.name
  891.     
  892.     
  893.     try:
  894.         if compiler is None:
  895.             compiler = get_default_compiler(plat)
  896.         
  897.         (module_name, class_name, long_description) = compiler_class[compiler]
  898.     except KeyError:
  899.         msg = "don't know how to compile C/C++ code on platform '%s'" % plat
  900.         if compiler is not None:
  901.             msg = msg + " with '%s' compiler" % compiler
  902.         
  903.         raise DistutilsPlatformError, msg
  904.  
  905.     
  906.     try:
  907.         module_name = 'distutils.' + module_name
  908.         __import__(module_name)
  909.         module = sys.modules[module_name]
  910.         klass = vars(module)[class_name]
  911.     except ImportError:
  912.         raise DistutilsModuleError, "can't compile C/C++ code: unable to load module '%s'" % module_name
  913.     except KeyError:
  914.         raise DistutilsModuleError, ("can't compile C/C++ code: unable to find class '%s' " + "in module '%s'") % (class_name, module_name)
  915.  
  916.     return klass(None, dry_run, force)
  917.  
  918.  
  919. def gen_preprocess_options(macros, include_dirs):
  920.     """Generate C pre-processor options (-D, -U, -I) as used by at least
  921.     two types of compilers: the typical Unix compiler and Visual C++.
  922.     'macros' is the usual thing, a list of 1- or 2-tuples, where (name,)
  923.     means undefine (-U) macro 'name', and (name,value) means define (-D)
  924.     macro 'name' to 'value'.  'include_dirs' is just a list of directory
  925.     names to be added to the header file search path (-I).  Returns a list
  926.     of command-line options suitable for either Unix compilers or Visual
  927.     C++.
  928.     """
  929.     pp_opts = []
  930.     for macro in macros:
  931.         None if type(macro) is TupleType else 1
  932.         if len(macro) == 2:
  933.             if macro[1] is None:
  934.                 pp_opts.append('-D%s' % macro[0])
  935.             else:
  936.                 pp_opts.append('-D%s=%s' % macro)
  937.         macro[1] is None
  938.     
  939.     for dir in include_dirs:
  940.         pp_opts.append('-I%s' % dir)
  941.     
  942.     return pp_opts
  943.  
  944.  
  945. def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):
  946.     """Generate linker options for searching library directories and
  947.     linking with specific libraries.  'libraries' and 'library_dirs' are,
  948.     respectively, lists of library names (not filenames!) and search
  949.     directories.  Returns a list of command-line options suitable for use
  950.     with some compiler (depending on the two format strings passed in).
  951.     """
  952.     lib_opts = []
  953.     for dir in library_dirs:
  954.         lib_opts.append(compiler.library_dir_option(dir))
  955.     
  956.     for dir in runtime_library_dirs:
  957.         opt = compiler.runtime_library_dir_option(dir)
  958.         if type(opt) is ListType:
  959.             lib_opts = lib_opts + opt
  960.             continue
  961.         lib_opts.append(opt)
  962.     
  963.     for lib in libraries:
  964.         (lib_dir, lib_name) = os.path.split(lib)
  965.         if lib_dir:
  966.             lib_file = compiler.find_library_file([
  967.                 lib_dir], lib_name)
  968.             if lib_file:
  969.                 lib_opts.append(lib_file)
  970.             else:
  971.                 compiler.warn("no library file corresponding to '%s' found (skipping)" % lib)
  972.         lib_file
  973.         lib_opts.append(compiler.library_option(lib))
  974.     
  975.     return lib_opts
  976.  
  977.